package cn.fl.customer.service;

import java.util.List;
import java.util.Map;

import cmm.mid.core.framework.dto.DataResultDTO;
import cmm.mid.core.framework.page.KeyValueVO;
import cmm.mid.core.framework.page.Pager;
import cn.cmm.base.framework.exception.BaseException;
import cn.fl.customer.vo.PrjBillApplyRecVO;
import cn.fl.customer.vo.PrjBillApplyVO;
import cn.fl.project.dto.PrjBscInfoDTO;
import com.alibaba.fastjson.JSONArray;
import fl.customer.facade.invoice.condition.PrjBillApplyRecQueryCondition;
import fl.customer.facade.invoice.condition.SearchValidInvoiceQueryCondition;
import fl.customer.facade.invoice.dto.InvoiceApplyReqDTO;
import fl.customer.facade.invoice.dto.PrjBillApplyDTO;
import fl.customer.facade.invoice.dto.PrjBillBscInfoDTO;
import fl.customer.facade.invoice.dto.ValidInvoiceDataDTO;
import fl.flow.facade.flow.dto.FlowStartParamsDTO;

/**
 * @Description: 票据申请表表 客户端服务层接口
 * @Description: 持久层方法名称前缀：新增：insert* 删除：delete* 修改：update* 批量：batch* 查询对象：select* get* find* 查询集合：select*
 * @Description: 业务层方法名称前缀：新增：add* 删除：remove* 修改：modify* 查询对象：select* get* 批量：batch* 查询集合：search*
 */
public interface IPrjBillApplyService {
	
	/**
	 * 发起流程-在加入业务数据获取到业务主键后启动流程
	 * @param flowStartParamsDTO
	 * @return
	 * @throws BaseException
	 */
	public DataResultDTO addFlowStart(FlowStartParamsDTO flowStartParamsDTO, PrjBillApplyVO entity) throws BaseException;
	
	/**
	 * 正常发起流程
	 * @param flowStartParamsDTO
	 * @return
	 * @throws BaseException
	 */
	public DataResultDTO addFlowStartNormal(FlowStartParamsDTO flowStartParamsDTO) throws BaseException;
	
	
	/**
	 * 获取唯一对象
	 * @param id 主键
	 * @return 对象DTO
	 */
	public PrjBillApplyVO selectById(Long id)throws BaseException;
	
	/**
	 * 新增
	 * @param entity
	 * @return
	 */
    public Long add(PrjBillApplyVO entity) throws BaseException;
    
	/**
	 * 新增结清流程保存开票
	 * @param entity
	 * @return
	 */
    public Long addClearPay(PrjBillApplyVO entity) throws BaseException;
    
	/**
	 * 新增票据基础信息
	 * @param entity
	 * @return
	 */
    public boolean addBillBscInfo(PrjBillApplyVO entity) throws BaseException;
    

    /**
     * 删除
     * @param id
     * @return
     */
    public boolean removeById(Long id)throws BaseException;
    
    /**
     * 删除
     * @param ids
     * @return
     */
    public boolean removeByIds(List<Long> ids)throws BaseException;

    /**
     * 修改
     * @param entity
     * @return
     */
    public boolean modify(PrjBillApplyVO entity)throws BaseException;
    
    /**
     * 作废
     * @param id 申请主键
     * @param billStsCd 票据状态
     * @return 是否成功
     * @throws BaseException
     */
    public boolean modifyStopUsedZF(Long id, String billStsCd)throws BaseException;
    
    /**
     * 分页查询所有
     * @param page
     * @return
     */
    public Pager searchListPage(Pager page)throws BaseException;
    
    /**
     * 查询申请列表中支付表数据(未开票数据)
     */
    public List<PrjBillApplyRecVO> searchApplyList(PrjBillApplyRecQueryCondition condition)throws BaseException;

    /**
     * 根据操作获取对应报文
     * @param operFlag
     * @param bscInfoId
     * @return
     * @throws BaseException
     */
    public JSONArray getXml(String operFlag, Long bscInfoId) throws BaseException;

    /**
     * 获取客户下的全部合同号
     * @param cstId
     * @return
     * @throws BaseException
     */
    public List<KeyValueVO> queryPrjByCstId(Long cstId) throws BaseException;

    /**
     * 查询支持的可开票费用项
     * @param billWayCd
     * 		PrjBillApplyConstant.BILL_WAY_CD_1  电子
     * 		PrjBillApplyConstant.BILL_WAY_CD_2	纸质
     * @return
     * @throws BaseException
     */
    List<KeyValueVO> querySupportFeeTyp(String billWayCd) throws BaseException;

    /**
     * 查询可开票列表数据
     * @param condition
     * @return
     * @throws BaseException
     */
    List<ValidInvoiceDataDTO> searchValidInvoiceList(SearchValidInvoiceQueryCondition condition) throws BaseException;

    /**
     * 纸质发票-作废
     * @param request
     * @return
     * @throws BaseException
     */
    DataResultDTO executeDoInvalidInvoicePaper(PrjBillBscInfoDTO request) throws BaseException;

    /**
     * 开具电子发票
     * @param reqDTO
     * @return
     * @throws BaseException
     */
    DataResultDTO executeDoInvoiceElectron(InvoiceApplyReqDTO reqDTO) throws BaseException;

    /**
     * 开具纸质发票
     * @param reqDTO
     * @return
     * @throws BaseException
     */
    DataResultDTO executeDoInvoicePaper(InvoiceApplyReqDTO reqDTO) throws BaseException;

    /**
     * 电子发票--获取版本文件下载地址
     * @param billId
     * @return
     * @throws BaseException
     */
    String getDownloadUrl(Long billId) throws BaseException;

    /**
     * 电子发票--重新推送
     * @param request
     * @throws BaseException
     */
    void executePush(PrjBillApplyVO request) throws BaseException;

    /**
     * 校验选择的待开票支付表费用项是否可以开票
     *
     * @param paySchDtlIdList  支付表费用项ID list
     * @throws BaseException
     */
    void checkInvoiceFeeIfPresent(List<Long> paySchDtlIdList) throws BaseException;

}
